package main.Primavera;

import com.primavera.PrimaveraException;
import com.primavera.ServerException;
import com.primavera.integration.client.ClientException;
import com.primavera.integration.client.RMIURL;
import com.primavera.integration.client.Session;
import com.primavera.integration.network.NetworkException;

import javax.swing.*;

public class LoginFunctions {

    public static final String REMOTE_MODE = "Remote";
    public static final String LOCAL_MODE = "Local";
    public Session session;
    public String sCallingMode;
    public String sHost;
    public int iPort;
    public int iRMIServiceMode;
    public String sUserName;
    public String sPassword;
    public String sDatabaseId;
    private int count;

    public boolean isRemoteModeAvailable() {
        return Session.isRemoteModeAvailable();
    }

    public LoginFunctions() {
        count = 0;
    }

    public com.primavera.integration.common.DatabaseInstance[] getDatabaseInstances() {
        // Load the available database instances
        try {
            return Session.getDatabaseInstances(getURL());
        } catch (ServerException e) {
            if (count == 1) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, "<html>Невозможно установить соединение с сервером. Сервер отказывает в соединении. <br>Пожалуйста, обратитесь к своему системному администратору</html>", "Ошибка", JOptionPane.ERROR_MESSAGE);
                count = 0;
            } else {
                count++;
            }
        } catch (NetworkException e) {
            if (count == 1) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, "<html>Невозможно установить соединение с сервером. Отсутствует подключение. <br>Пожалуйста, обратитесь к своему системному администратору</html>", "Ошибка", JOptionPane.ERROR_MESSAGE);
                count = 0;
            } else {
                count++;
            }
        } catch (ClientException e) {
            if (count == 1) {
                e.printStackTrace();
                JOptionPane.showMessageDialog(null, "<html>Невозможно установить соединение с сервером. <br>Пожалуйста, обратитесь к разработчику</html>", "Ошибка", JOptionPane.ERROR_MESSAGE);
                count = 0;
            } else {
                count++;
            }

        }
        return null;
    }


    private String getURL() {
        String sRmiUrl = null;
        if (REMOTE_MODE.equalsIgnoreCase(this.sCallingMode)) {
            sRmiUrl = RMIURL.getRmiUrl(this.iRMIServiceMode, this.sHost, this.iPort);
        }
        return sRmiUrl;
    }


    public void login()
            throws PrimaveraException {
        session = Session.login(getURL(), this.sDatabaseId, this.sUserName, this.sPassword);
    }


    public void logout() {
        session.logout();
    }

    public void setConnectionInfo(ConnectionInfo conninfo) {
        if (conninfo != null) {
            this.sCallingMode = conninfo.sCallingMode;
            this.sHost = conninfo.sHost;
            this.iPort = conninfo.iPort;
            this.iRMIServiceMode = conninfo.iRMIServiceMode;
        } else {

        }
    }

    public void setLoginInfo(LoginInfo logininfo) {
        this.sUserName = logininfo.sUserName;
        this.sPassword = logininfo.sPassword;
        this.sDatabaseId = logininfo.sDatabaseId;
    }


    public static class ConnectionInfo {
        // Mode of operation: local or remote
        public String sCallingMode;

        // Host for remote mode
        public String sHost;

        // Port for remote mode
        public int iPort;

        // RMI service mode used by remote mode
        public int iRMIServiceMode;
    }

    public static class LoginInfo {
        // User name for logging in
        public String sUserName;

        // Password for logging in
        public String sPassword;

        // Database instance ID
        public String sDatabaseId;
    }

}
